﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// Operate sprite order depend on y position.
/// </summary>
public class SpriteSorting : MonoBehaviour
{
    // 若为 true，只在启动时更新排序，不会在运行时持续更新。
    public bool isStatic;
    // 控制排序精度的倍数，默认值为100。
    public float rangeFactor = 100f;

    // 存储该对象及其子对象的所有 SpriteRenderer，以及初始的排序顺序。
    private Dictionary<SpriteRenderer, int> sprites = new Dictionary<SpriteRenderer, int>();

    /// <summary>
    /// 收集所有子对象的 SpriteRenderer 并记录初始排序顺序。
    /// </summary>
    void Awake()
    {
        foreach (SpriteRenderer sprite in GetComponentsInChildren<SpriteRenderer>())
        {
            sprites.Add(sprite, sprite.sortingOrder);
        }
    }

    /// <summary>
    /// 初始化阶段，若是静态对象则只此一次更新排序顺序。
    /// </summary>
    void Start()
    {
        UpdateSortingOrder();
    }

    /// <summary>
    /// 根据是否为静态对象决定是否更新排序顺序。
    /// </summary>
    void Update()
    {
        if (isStatic == false)
        {
            UpdateSortingOrder();
        }
    }

    /// <summary>
    /// 根据 y 坐标计算新的 sortingOrder 并赋值。
    /// </summary>
    private void UpdateSortingOrder()
    {
        foreach (KeyValuePair<SpriteRenderer, int> sprite in sprites)
        {
            sprite.Key.sortingOrder = sprite.Value - (int)(transform.position.y * rangeFactor);
        }
    }
}
